Defer the callbacks to an idle to avoid deadlock with xcb-ified libX11.
authorMatthias Clasen <mclasen@redhat.com>
Fri, 9 Mar 2007 05:28:00 +0000 (05:28 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Mar 2007 05:28:00 +0000 (05:28 +0000)
2007-03-08  Matthias Clasen <mclasen@redhat.com>

        * gdk/x11/gdkasync.c (send_event_handler): Defer the callbacks
        to an idle to avoid deadlock with xcb-ified libX11.  (#413032,
        Sebastian Dröge)

svn path=/trunk/; revision=17436

ChangeLog
gdk/x11/gdkasync.c

index ded01546c7d11b9538a307ce2bcdd2abe7fd7e9a..ff3409c3f5a60804c63f385372a1abb3edf78149 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-08  Matthias Clasen <mclasen@redhat.com>
+
+       * gdk/x11/gdkasync.c (send_event_handler): Defer the callbacks
+       to an idle to avoid deadlock with xcb-ified libX11.  (#413032,
+       Sebastian Dröge)
+
 2007-03-08  Matthias Clasen <mclasen@redhat.com>
 
        * gtk/gtknotebook.c (gtk_notebook_real_insert_page):
index e360bf1a15c5c210be5aadf6d9274a7e115dc2c6..633666006165c70eedc285192227cdea18b81bfc 100644 (file)
@@ -112,6 +112,18 @@ struct _SetInputFocusState
   gulong get_input_focus_req;
 };
 
+static gboolean
+callback_idle (gpointer data)
+{
+  SendEventState *state = (SendEventState *)data;  
+  
+  state->callback (state->window, !state->have_error, state->data);
+
+  g_free (state);
+
+  return FALSE;
+}
+
 static Bool
 send_event_handler (Display *dpy,
                    xReply  *rep,
@@ -147,12 +159,10 @@ send_event_handler (Display *dpy,
        }
 
       if (state->callback)
-       state->callback (state->window, !state->have_error, state->data);
+        gdk_threads_add_idle (callback_idle, state);
 
       DeqAsyncHandler(state->dpy, &state->async);
 
-      g_free (state);
-
       return (rep->generic.type != X_Error);
     }